package com.wmh.baseservice.common.mybatisplus;

import java.lang.reflect.Field;
import java.lang.reflect.Modifier;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

/**
 * @author 谢骏
 * @date 2023/9/14 15:27
 **/
public class EntityUtil {

    /**
     * 获取类中被 public static final 修饰的字段的值
     * @param clazz 类对象
     * @param prefix 字段前缀 COL_
     * @param excludeFields 需要忽略的字段
     * @return 数据库字段名列表
     */
    public static List<String> getFieldValuesWithPrefix(Class<?> clazz, String prefix, String... excludeFields) {
        List<String> fieldValues = new ArrayList<>();

        // 创建一个集合用于存储要排除的字段名
        List<String> excludedFieldList = Arrays.asList(excludeFields);

        Field[] fields = clazz.getDeclaredFields();
        for (Field field : fields) {
            int modifiers = field.getModifiers();
            if (Modifier.isPublic(modifiers) && Modifier.isStatic(modifiers) && Modifier.isFinal(modifiers)) {
                String fieldName = field.getName();
                if (fieldName.startsWith(prefix)) {
                    try {
                        // 设置访问权限，以便访问私有字段
                        field.setAccessible(true);
                        // 传入 null 表示从类中获取静态字段的值
                        String fieldValue = (String) field.get(null);
                        if (!excludedFieldList.contains(fieldValue)){
                            fieldValues.add(fieldValue);
                        }
                    } catch (IllegalAccessException e) {
                        e.printStackTrace();
                    }
                }
            }
        }

        // 将 List 转换为数组
        return fieldValues;
    }

}
